<?php

/**
 * <b>READ</b>
 * Classe responsavel por leituras genericas no banco de dados.
 * @copyright (c) year, Romulo B. Bosco 
 */
class Read extends Conn {
    
    
    private $Select;
    /**
     * FARA OS BIND VALUES
     * @var string
     */
    private $Places;
    
    /**
     * IMPRIME OS RESULTADOS
     * @var 
     */
    private $Result;

    /** 
     * O ATRIBUTO DE PDOSTATEMENT TERA SEMPRE O NOME DA CLASSE
     * @var PDOStatement 
     */
    private $Read;

    /** @var PDO */
    private $Conn;
    
    /**
     * 
     * @param type $Tabela = NOME DA TABELA
     * @param type $Termos = CONDICOES DE LEITURA. NAO PODE SER REQUISITADO. $Termos = null.
     * @param type $ParseString = SUBSTITUI OS LINKS PELO PREPARESTATEMENT
     */
    public function ExeRead($Tabela, $Termos = null, $ParseString = null) {
        //!empty DEVE EXISTIR E NAO PODE SER NULO.
        if (!empty($ParseString)):
            
            //ATRIBUI O $ParseString A VARIAVEL $Places
            $this->Places = $ParseString;
            
            //parse_str = CONVERTE UMA STRING EM UM ARRAY DE ARMAZENAMENTO
            //$ParseString = string com campos e values.
            //$this->Places = o array de armazenamento.
            parse_str($ParseString, $this->Places);
        endif;
        
        //CRIA A QUERY COM NOME DA TABELA E OS TERMOS
        $this->Select = "SELECT * FROM {$Tabela} {$Termos}";
        $this->Execute();
    }
    
    /**
     * RESULTADO DA QUERY EM FETCH_ASSOC
     * @return ARRAY
     */
    public function getResult() {
        return $this->Result;
    }
    
    /**
     * RETORNA A QUANTIDADE DE RESULTADO.
     * @return ARRAY
     */
    public function getRowCount() {
        
        //RETORNA O NUMERO DE RESULTADOS
        return $this->Read->rowCount();
    }
    
    /**
     * FAZ A CONSULTA COMPLETA MANUALMENTE.
     * @param STRING $Query
     * @param STRING $ParseString
     */
    public function FullRead($Query, $ParseString = null){
        $this->Select = (string) $Query;
        //!empty DEVE EXISTIR E NAO PODE SER NULO.
        if (!empty($ParseString)):
            
            //ATRIBUI O $ParseString A VARIAVEL $Places
            $this->Places = $ParseString;
            
            //parse_str = CONVERTE UMA STRING EM UM ARRAY DE ARMAZENAMENTO
            //$ParseString = string com campos e values.
            //$this->Places = o array de armazenamento.
            parse_str($ParseString, $this->Places);
        endif;
        $this->Execute();
    }
    
    /**
     * PEGA APENAS O $ParseString E EXECUTA O METODO EXECUTE.
     * @param STRING $ParseString
     */
    public function setPlaces($ParseString) {
        parse_str($ParseString, $this->Places);
        $this->Execute();
    }
    
    /**
     * ****************************************
     * *********** PRIVATE METHODS ************
     * ****************************************
     */
    
    /**
     * OBTEM A CONEXAO COM O PDO E PREPARA A QUERY.
     */
    private function Connect() {
        
        //FAZ A CONEXAO
        $this->Conn = parent::getConn();
        
        //PREPARA A QUERY COM O OBJETO PDO
        $this->Read = $this->Conn->prepare($this->Select);
        
        //RETORNA ARRAYS ASSOCIATIVO
        $this->Read->setFetchMode(PDO::FETCH_ASSOC);
    }
    
    /**
     * CRIA A SINTAXE DA QUERY PARA PREPARED STATEMENTS
     */
    private function getSyntax() {
        
       //VERIFICA SE TEM ARRAY
       if($this->Places):
           //BUSCA AS CHAVES E VALORES DO ARRAY ASSOCIATIVO
           foreach ($this-> Places as $Chave => $Valor):
                if($Chave == 'limit' || $Chave == 'offset'):
                    //SE CONDICAO VERDADEIRA, O VALOR SERA UM INT.
                    $Valor = (int) $Valor;
                endif;
                //VERIFICA O TIPO DA VARIAVEL $Valor.
                //SE INTEIRO, PDO PASSA PARA INT.
                //SENAO PDO MANTEM A STRING.
                $this->Read->bindValue(":{$Chave}", $Valor, (is_int($Valor) ? PDO::PARAM_INT : PDO::PARAM_STR ));
           endforeach;
       endif;
    }
    
    //OBTEM AS FUNCOES DE CONEXAO E DE SYNTAX, EXECUTA A QUERY.
    private function Execute() {
        //FUNCAO DE CONEXAO.
        $this->Connect();
        try{
            //FUNCAO DE SYNTAX
            $this->getSyntax();
            $this->Read->execute();
            $this->Result = $this->Read->fetchAll();
        } catch (PDOException $ex) {
            $this->Result = null;
            WSErro("<b>Erro ao SELECIONAR:</b> {$ex->getMessage()}", $ex->getCode());
        }
    }

}
